package com.sparkseries.service;

import com.sparkseries.common.util.domain.Result;
import com.sparkseries.domain.vo.SysNoticeVO;
import com.sparkseries.dto.SysNoticeDTO;

import java.util.List;
import java.util.Map;

/**
 * 通知管理
 */
public interface SysNoticeService {
    /**
     * 推送通知
     *
     * @param sysNoticeDTO 通知传输类
     * @return 默认响应类
     */
    Result<?> createNotice(SysNoticeDTO sysNoticeDTO);

    /**
     * 撤回删除通知
     *
     * @param noticeId 通知id
     * @return 默认响应类
     */
    Result<?> revokeNotice(Long noticeId);

    /**
     * 删除推送通知
     *
     * @param noticeId 通知id
     * @return 默认响应类
     */
    Result<?> deleteNotice(Long noticeId);

    /**
     * 修改推送通知
     *
     * @param sysNoticeDTO 通知传输类
     * @return 默认响应类
     */
    Result<?> updateNotice(SysNoticeDTO sysNoticeDTO);

    /**
     * 修改推送通知状态
     *
     * @param noticeId 通知id
     * @param status 状态
     * @return 默认响应类
     */
    Result<?> updateNoticeStatus(Long noticeId, Integer status);

    /**
     * 我的消息标记为已读
     *
     * @param noticeId 通知id
     * @return 默认响应类
     */
    Result<?> updateReadStatus(Long noticeId);

    /**
     * 获取推送通知
     *
     * @param noticeId 通知id
     * @return 通知响应类
     */
    Result<SysNoticeVO> getNoticeById(Long noticeId);

    /**
     * 获取我的通知
     *
     * @param noticeId 通知id
     * @return 通知响应类
     */
    Result<SysNoticeVO> getMyNoticeById(Long noticeId);

    /**
     * 推送通知列表
     *
     * @param sysNoticeDTO 通知传输类
     * @return 通知响应类集合
     */
    Result<List<SysNoticeVO>> listNotice(SysNoticeDTO sysNoticeDTO);

    /**
     * 我的通知列表
     *
     * @param sysNoticeDTO 通知传输类
     * @return 通知响应类集合
     */
    Result<List<SysNoticeVO>> listMyNotice(SysNoticeDTO sysNoticeDTO);

    /**
     * 删除我的通知
     *
     * @param noticeId 通知ID
     * @return 默认响应类
     */
    Result<?> deleteMyNotice(Long noticeId);

    /**
     * 某通知的已读用户和未读用户列表
     *
     * @param noticeId 通知id
     * @return map集合，键为用户名，值为读取状态
     */
    Result<Map<String, Integer>> listNoticeReadIdsAndUnReadIds(Long noticeId);
}
